Skip to Content

功能

  • 处理来自表示层的请求,执行业务规则,并与数据访问层进行交互
  • 表示层提供了一个清晰的API接口,同时隐藏了数据访问的细节,使得业务逻辑更加集中和易于管理

处理流程

  1. 接收请求:表示层控制器会将请求转发给业务逻辑层相应的服务(Service)进行处理。
  2. 参数验证:业务逻辑层接收到请求后,会对传入的参数进行进一步的验证,确保数据的完整性和合法性。这通常涉及到业务规则的校验,如数据格式、范围、依赖关系等。
  3. 业务处理:验证通过后,业务逻辑层会执行具体的业务操作。这可能包括复杂的数据计算、调用其他服务、执行特定的业务流程等。业务逻辑层的核心目的是实现应用程序的核心业务功能。
  4. 数据访问:在执行业务操作的过程中,业务逻辑层通常需要与数据访问层进行交互,以读取或写入数据。它会调用数据访问层的接口,而不直接与数据库打交道。这样的设计可以保证业务逻辑与数据访问的解耦,提高系统的可维护性。
  5. 事务管理:业务逻辑层还需要处理事务管理,确保一组操作的原子性。
  6. 返回结果:业务操作完成后,业务逻辑层会构造相应的响应数据,并将其返回给表示层。如果业务操作失败,业务逻辑层还需要负责处理异常,并将错误信息传递回表示层。

事务管理

功能

  • 确保一组操作要么全部成功,要么全部失败,以业务操作的ACID特性
    • 原子性(Atomicity)
    • 一致性(Consistency)
    • 隔离性(Isolation)
    • 持久性(Durability)

实现

  • @EnableTransactionManagement:配置事务管理器,开启事务管理功能
@SpringBootApplication @EnableTransactionManagement public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
  • @Transactional :在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作
@Service public class BookService { @Autowired private BookRepository bookRepository; // 用于操作数据库的书籍库存 @Autowired private OrderRepository orderRepository; // 用于操作数据库的订单 @Transactional // 这个方法内的所有操作需要在一个事务中执行 public void createOrder(String bookId, int quantity) { // 1. 检查库存是否足够 Book book = bookRepository.findById(bookId).orElseThrow(() -> new RuntimeException("Book not found")); if (book.getStock() < quantity) { throw new RuntimeException("Not enough stock"); } // 2. 更新库存 book.setStock(book.getStock() - quantity); bookRepository.save(book); // 3. 创建订单 Order order = new Order(book, quantity); orderRepository.save(order); } }

细节

  • @Transactional注解书写位置
    • 方法:当前方法交给 spring 进行事务管理
    • 类:当前类中所有的方法都交由 spring 进行事务管理
    • 接口:接口下所有的实现类当中所有的方法都交给 spring 进行事务管理
  • 在yml配置文件中开启事务管理日志
#spring事务管理日志 logging: level: org.springframework.jdbc.support.JdbcTransactionManager: debug
Last updated on